/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Klijent;

import GUI.*;
import Server.FileSystem;
import Server.ServerInfo;
import Strukture.Cvor;
import Strukture.Flare;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.net.Socket;
import java.util.LinkedList;
import javax.swing.JOptionPane;

/**
 *
 * @author voja
 */
public class Komunikacija{
    
    
    public static void communication(Server.Korisnik user, int status, String lokacija, Flare raketa) throws IOException {
        try (Socket soket = new Socket("localhost", 2222)) {
            byte [] bafer = new byte [1024];
            
            //inicijalizacija ulazno-izlaznih tokova
                //izlaz za tekst
                PrintWriter tokKaServeruTekst = new PrintWriter(soket.getOutputStream(), true);
               
                //izlaz za bajtove          
                OutputStream tokKaServeruBajtovi = soket.getOutputStream();
                
                //ulaz za linijski tekst         
                BufferedReader tokOdServeraTekst = new BufferedReader(new InputStreamReader(soket.getInputStream()));
                
                //ulaz za bajtove      
                InputStream tokOdServeraBajtovi = soket.getInputStream();
                
                tokKaServeruTekst.println("Zahtevam konekciju");
                System.out.println("Klijent je napisao:"+"Zahtevam konekciju");
                
                String odgovor = tokOdServeraTekst.readLine();
                System.out.println("Klijent je napisao:"+odgovor);
                
                if ("Konekcija odobrena".equalsIgnoreCase(odgovor)){
            
                if(status == 1){

                    tokKaServeruTekst.println("Novi korisnik");
                    System.out.println("Klijent je napisao:"+"Novi korisnik");
                    String odgovor1 = tokOdServeraTekst.readLine();               
                    System.out.println("Klijent je napisao"+odgovor1);
                    tokKaServeruTekst.println(user.getIme());
                    tokKaServeruTekst.println(user.getSifra());
                    
                    String odgovor2 = tokOdServeraTekst.readLine();
                    System.out.println(tokOdServeraTekst.readLine());
                    if (odgovor2.equalsIgnoreCase("Uspesno napravljen novi korisnik")){
                        raketa.tekstZaPrenos = "Uspesno napravljen novi korisnik";
                    } else {
                        raketa.tekstZaPrenos = "Nesto se zeznulo.";
                    }
                    
                }

                if(status == 2){

                    tokKaServeruTekst.println("Zelim da se ulogujem");
                    tokOdServeraTekst.readLine();
                    tokKaServeruTekst.println(user.getIme());
                    String odgovorServera = tokOdServeraTekst.readLine();
                    if ("Nalog ne postoji. Molimo vas napravite nalog.".equals(odgovorServera)){
                        raketa.tekstZaPrenos = "Na serveru NE POSTOJIS!!!";               
                    }
                    if("Posalji sifru korisnika".equalsIgnoreCase(odgovorServera)){
                        tokKaServeruTekst.println(user.getSifra());
                    }
                    String konacniOdgovor = tokOdServeraTekst.readLine();
                    
                    if("Uspesno ste se ulogovali".equalsIgnoreCase(konacniOdgovor)){
                        raketa.tekstZaPrenos = "Login je ok! :)";
                        UlogovaniKorisnik.setImeKorisnika(user.getIme());
                        UlogovaniKorisnik.setSifraKorisnika(user.getSifra());                   
                    }
                    
                    if ("Pogresno ime korisnika ili lozinka.".equalsIgnoreCase(konacniOdgovor)){
                        raketa.tekstZaPrenos = "Pogresno ime korisnika ili lozinka.";
                    }

                }
                
                if (status == 3){
                    tokKaServeruTekst.println ("Sinhronizacija ka Serveru");
                    tokKaServeruTekst.println (user.getIme());
                    tokKaServeruTekst.println (user.getSifra());
                    
                    String veto = tokOdServeraTekst.readLine();
                    if (veto.equalsIgnoreCase("Ne moze!")){
                        raketa.tekstZaPrenos = "Ne moze sync, trenutno je aktivan korisnik!";
                        return;
                    } else {
                    
                    tokOdServeraTekst.readLine();
                    
                    Cvor novi = new Cvor(lokacija);
                    Server.FileSystem.napraviStablo(novi, user);

                    //pretvaramo apsolutne putanje u relativne i dodajemo ih u liste korisnika, potom ih saljemo serveru
                    tokKaServeruTekst.println("Pocinje spisak fajlova");
                    for (String blabla: user.getListaLokacijaFajlova()){
                        String zaUbac = FileSystem.vratiRelativnuPutanju(blabla, lokacija);
                        user.getListaLokacijaFajlovaRelativnePutanje().add(zaUbac);
                        tokKaServeruTekst.println(zaUbac);
                    }
                    tokKaServeruTekst.println("Kraj spiska fajlova");
                    
                    tokKaServeruTekst.println("Pocetak spiska foldera");
                    for (String blabla: user.getListaLokacijaFoldera()){
                        String zaUbac = FileSystem.vratiRelativnuPutanju(blabla, lokacija);
                        user.getListaLokacijaFolderaRelativnePutanje().add(zaUbac);
                        tokKaServeruTekst.println(zaUbac);
                    }
                    tokKaServeruTekst.println("Kraj spiska foldera");                   
                    
                    LinkedList <String> saljiNaServer = new LinkedList <String>();
                    tokOdServeraTekst.readLine();
                    while(true){
                        String por = tokOdServeraTekst.readLine();
                        if (por.equalsIgnoreCase("Kraj spiska")) break;
                        saljiNaServer.add(lokacija+por);
                    }
                    
                    LinkedList <String> saljiNaServerRelPut = new LinkedList <String>();
                    for (String str: saljiNaServer){
                        saljiNaServerRelPut.add(FileSystem.vratiRelativnuPutanju(str, lokacija));
                    }
                    
                    //test deo metode:
                    System.out.println("Pocetak testa");
                    for (String str: saljiNaServerRelPut){
                        System.out.println(str);
                    }
                    System.out.println("Kraj testa");

                    //sada klijent treba da posalje fajlove serveru
                    tokKaServeruTekst.println("Saljem fajlove!");
                    for (String str: saljiNaServerRelPut){
                        System.out.println("Ima elemenata "+saljiNaServerRelPut.size());
                        
                        tokKaServeruTekst.println(str);
                        System.out.println("Poslao serveru" + " fajl");

                        tokOdServeraTekst.readLine();
                        System.out.println("Dobio poruku od servera");
                        RandomAccessFile raf = new RandomAccessFile (lokacija+str, "r");
                        System.out.println("Napravio raf na lokaciji"+ lokacija+str);
                        int n;
                        boolean kraj = false;
                        while (kraj == false){
                            //ucitava bajtove iz fajla, pokusace da ucita 1024 bajta, a kao n pamti koliko je stvarno ucitao
                            n = raf.read(bafer);
                            System.out.println("n je  "+n);
                            if (n == -1){
                                tokKaServeruTekst.println("-1");
                                kraj = true;
                                System.out.println("Kraj fajla! "+lokacija+str);
                            }
                            if (kraj == false){
                            //ispisujemo tih n bajtova u izlazni tok ka serveru
                            tokKaServeruTekst.println("Veci od 0");
                            tokKaServeruBajtovi.write(bafer, 0, n);
                            System.out.println("Poslao bafer");
                            tokOdServeraTekst.readLine();
                            }
                        }
                        tokOdServeraTekst.readLine();
                        System.out.println("Poslao klijent "+lokacija+str);
                        
                        //zatvaramo ulazni tok fajla
                        raf.close();
                    }
                    tokKaServeruTekst.println("Kraj fajlova");
                System.out.println("GOTOVA METODA!");
                raketa.tekstZaPrenos = "Sve OK! :)";
                 
                    }
                }
                
                if (status == 4){

                    tokKaServeruTekst.println ("Sinhronizacija od Servera");
                    tokKaServeruTekst.println (user.getIme());
                    tokKaServeruTekst.println (user.getSifra());
                    
                    String veto = tokOdServeraTekst.readLine();
                    if (veto.equalsIgnoreCase("Ne moze!")){
                        raketa.tekstZaPrenos = "Ne moze sync, trenutno je aktivan korisnik!";
                        return;
                    } else {
                    tokOdServeraTekst.readLine();
                    
                    Cvor novi = new Cvor(lokacija);
                    Server.FileSystem.napraviStablo(novi, user);

                    //pretvaramo apsolutne putanje u relativne i dodajemo ih u liste korisnika, potom ih saljemo serveru
                    tokKaServeruTekst.println("Pocinje spisak fajlova");
                    for (String blabla: user.getListaLokacijaFajlova()){
                        String zaUbac = FileSystem.vratiRelativnuPutanju(blabla, lokacija);
                        user.getListaLokacijaFajlovaRelativnePutanje().add(zaUbac);
                        tokKaServeruTekst.println(zaUbac);
                    }
                    tokKaServeruTekst.println("Kraj spiska fajlova");
                    
                    tokKaServeruTekst.println("Pocetak spiska foldera");
                    for (String blabla: user.getListaLokacijaFoldera()){
                        String zaUbac = FileSystem.vratiRelativnuPutanju(blabla, lokacija);
                        user.getListaLokacijaFolderaRelativnePutanje().add(zaUbac);
                        tokKaServeruTekst.println(zaUbac);
                    }
                    tokKaServeruTekst.println("Kraj spiska foldera"); 
                    
                    //klijent prima listu foldera koje treba da napravi:
 
                    LinkedList <String> listaFolderaKojeTrebaNapraviti = new LinkedList <String> ();
                    tokOdServeraTekst.readLine();
                    while (true){
                        String poruka = tokOdServeraTekst.readLine();
                        if (poruka.equalsIgnoreCase("Kraj liste foldera")) break;
                        listaFolderaKojeTrebaNapraviti.add(poruka);
                    }
                    
                    //sada pravimo foldere
                    for (String str: listaFolderaKojeTrebaNapraviti){
                        File folder = new File (lokacija+"/"+str);
                        folder.mkdirs();
                    }
                    
                    //test deo metode
                    for (String str: listaFolderaKojeTrebaNapraviti){
                        System.out.println(str);
                    }
                    
                    //treba da serveru posaljemo milisekunde za svaki fajl uz relativne putanje
                    tokKaServeruTekst.println("Saljem lokacije sa milisekundama!");
                    for (String bla: user.getListaLokacijaFajlova()){
                        tokKaServeruTekst.println(FileSystem.vratiRelativnuPutanju(bla, lokacija));
                    }
                    tokKaServeruTekst.println("Kraj liste!");

                    //server nam salje koliko fajlova ima
                    int brojFajlova = Integer.parseInt(tokOdServeraTekst.readLine());
                    
                    
                    
                  //primamo fajlove od servera
                String mnogoOpakString = tokOdServeraTekst.readLine();

                System.out.println("ODAVDE POCINJE");
                for (int i=0; i<brojFajlova; i++){
                    System.out.println("Ima elemenata "+brojFajlova);
                    System.out.println("UCITAO PRVI STRING IZ LISTE");
                    String tekst = tokOdServeraTekst.readLine();
                    System.out.println("Dobio od klijenta:"+tekst);
                    if (tekst.equalsIgnoreCase("Kraj fajlova")) break;
                    System.out.println("Nije break!");
                    //lokacija fajl
                    String lok = lokacija+"/"+tekst;
                    System.out.println("Lokacija = "+lok);
                    
                    //pravimo novi objekat klase File
                    File file = new File(lok);
 
                    // ako fajl na diskku ne postoji, pravimo ga
                    if (!file.exists()) {
                        //file.getParentFile().mkdirs();
			file.createNewFile();
                        System.out.println("Ne postoji fajl na disku");
                    }
                    
                    tokKaServeruTekst.println("novi");
                    System.out.println("Poslao sam klijentu 'novi'");
                    RandomAccessFile raf = new RandomAccessFile (lok, "rw");
                    int n;
                    boolean kraj = false;
                    while (kraj == false){
                        
                        String check = tokOdServeraTekst.readLine();
                        if (check.equals("-1")){
                            kraj = true;
                            System.out.println("Postavio sam kraj na true!");
                        }
                        if (kraj==false){
                        //ucitavamo prenesene bajtove, pokusace da ucita 1024 bajta, n je broj bajtova koje je stvarno ucitao
                        n = tokOdServeraBajtovi.read(bafer, 0, 1024);
                        System.out.println("n je"+n);

                        //bajtovi se upisuju u fajl
                        raf.write(bafer, 0, n);
                        System.out.println("Primio bafer");
                        tokKaServeruTekst.println();
                        }
                    }
                    System.out.println("Kraj fajla!");
                    raf.close();
                    tokKaServeruTekst.println("Moze naredni!");
                    //zatvara se tok ka fajlu

                    System.out.println("Poslao klijentu: Moze naredni");
                }
                System.out.println("GOTOVA METODA!");                   
                    
                raketa.tekstZaPrenos = "Sve OK! :)";                    
                    
                     
//                    LinkedList <String> saljiNaServer = new LinkedList <String>();
//                    tokOdServeraTekst.readLine();
//                    while(true){
//                        String por = tokOdServeraTekst.readLine();
//                        if (por.equalsIgnoreCase("Kraj spiska")) break;
//                        saljiNaServer.add(lokacija+por);
//                    }
//                    
//                    LinkedList <String> saljiNaServerRelPut = new LinkedList <String>();
//                    for (String str: saljiNaServer){
//                        saljiNaServerRelPut.add(FileSystem.vratiRelativnuPutanju(str, lokacija));
//                    }
//                    
//                    //test deo metode:
//                    System.out.println("Pocetak testa");
//                    for (String str: saljiNaServerRelPut){
//                        System.out.println(str);
//                    }
//                    System.out.println("Kraj testa");

                    //sada klijent treba da posalje fajlove serveru
//                    tokKaServeruTekst.println("Saljem fajlove!");
//                    for (String str: saljiNaServerRelPut){
//                        System.out.println("Ima elemenata "+saljiNaServerRelPut.size());
//                        
//                        tokKaServeruTekst.println(str);
//                        System.out.println("Poslao serveru" + " fajl");
//
//                        tokOdServeraTekst.readLine();
//                        System.out.println("Dobio poruku od servera");
//                        RandomAccessFile raf = new RandomAccessFile (lokacija+str, "r");
//                        System.out.println("Napravio raf na lokaciji"+ lokacija+str);
//                        int n;
//                        boolean kraj = false;
//                        while (kraj == false){
//                            //ucitava bajtove iz fajla, pokusace da ucita 1024 bajta, a kao n pamti koliko je stvarno ucitao
//                            n = raf.read(bafer);
//                            System.out.println("n je  "+n);
//                            if (n == -1){
//                                tokKaServeruTekst.println("-1");
//                                kraj = true;
//                                System.out.println("Kraj fajla! "+lokacija+str);
//                            }
//                            if (kraj == false){
//                            //ispisujemo tih n bajtova u izlazni tok ka serveru
//                            tokKaServeruTekst.println("Veci od 0");
//                            tokKaServeruBajtovi.write(bafer, 0, n);
//                            System.out.println("Poslao bafer");
//                            tokOdServeraTekst.readLine();
//                            }
//                        }
//                        tokOdServeraTekst.readLine();
//                        System.out.println("Poslao klijent "+lokacija+str);
//                        
//                        //zatvaramo ulazni tok fajla
//                        raf.close();
//                    }
//                    tokKaServeruTekst.println("Kraj fajlova");
//                System.out.println("GOTOVA METODA!");
              
                                     
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    }  
                }
            
            }else{
        
            System.out.println("Nije moguce uspostaviti konekciju");

        }
                soket.close();
        }            
            
            
        
            
    
    }
}
